import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Date;

/**
 * @program: swigModel
 * @description: 文件选择器
 * @author: 顾小皓
 * @create: 2020-06-27 19:04
 **/
public class modelJFileChooser extends Thread{
    private static String docxName = new Date().toString();
    private static Boolean status = false;
    private static ByteArrayOutputStream byteArrayOutputStream = null;
    private static Boolean workStatus = false;
    private static FileInputStream fileInputStream = null;
    private static String fileName;
    private static final JTextArea msgTextArea = new JTextArea(10, 30);

    public static void main(String[] args) throws Exception {
        final JFrame jf = new JFrame("PDF转DOCX  By:顾小皓");
        jf.setSize(400, 250);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();

        // 创建文本区域, 用于显示相关信息
        msgTextArea.setLineWrap(true);
        JButton openBtn = new JButton("打开");
        openBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (workStatus == false){
                    msgTextArea.setText(null);//清空文本域
                    if(showFileOpenDialog(jf, msgTextArea)){
                        modelJFileChooser modelJFileChooser = new modelJFileChooser();
                        modelJFileChooser.start();
//                        toWordMethod(msgTextArea);
                    }
                }else {
                    msgTextArea.append("上一个任务还在转换中..." + "\n\n");
                }
            }
        });
        panel.add(openBtn);

        JButton saveBtn = new JButton("保存");
        saveBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (status == true) {
                    showFileSaveDialog(jf, msgTextArea);
                } else {
                    msgTextArea.append("请先选择要转换的PDF文件" + "\n\n");
                }
            }
        });
        panel.add(saveBtn);
        panel.add(msgTextArea);
        jf.setContentPane(panel);
        jf.setVisible(true);
    }

    /*
     * 打开文件
     */
    private static boolean showFileOpenDialog(Component parent, JTextArea msgTextArea) {
        // 创建一个默认的文件选取器
        JFileChooser fileChooser = new JFileChooser();

        // 设置默认显示的文件夹为当前文件夹
        fileChooser.setCurrentDirectory(new File("."));

        // 设置文件选择的模式（只选文件、只选文件夹、文件和文件均可选）
        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        // 设置是否允许多选
        fileChooser.setMultiSelectionEnabled(false);
        //删除“全部文件”这个选项
        fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());

        // 设置默认使用的文件过滤器
        fileChooser.setFileFilter(new FileNameExtensionFilter("PDF(*.pdf)", "pdf"));

        // 打开文件选择框（线程将被阻塞, 直到选择框被关闭）
        int result = fileChooser.showOpenDialog(parent);

        if (result == JFileChooser.APPROVE_OPTION) {
            // 如果点击了"确定", 则获取选择的文件路径
            File file = fileChooser.getSelectedFile();

            // 如果允许选择多个文件, 则通过下面方法获取选择的所有文件
            // File[] files = fileChooser.getSelectedFiles();
            try {
                fileInputStream = new FileInputStream(file);
            } catch (FileNotFoundException e) {
                msgTextArea.append("没有找到该文件..." + "\n\n");
                return false;
            }
            msgTextArea.append("打开文件: " + file.getAbsolutePath() + "\n\n" + "正在转换中..." + "\n\n");
            //获取文件名
            fileName = file.getName();
            return true;
        }
        return false;
    }
    @Override
    public void run(){
        toWordMethod(msgTextArea);
    }
    /**
     * 转word主方法
     * @param msgTextArea
     */
    private static void toWordMethod(JTextArea msgTextArea){
        try {
            workStatus = true;//设置是否当前为工作状态
            byteArrayOutputStream = PdfToByteArrayOutputStream(fileInputStream);
        } catch (Exception e) {
            msgTextArea.append("文件转换出错，确认一下这个文件是不是pdf的" + "\n\n");
            return;
        }finally {
            workStatus = false;//设置是否当前为工作状态
        }
        //设置文件转换状态
        status = true;
        msgTextArea.append("文件转换成功！" + "\n\n");
        //获取文件名（没有后缀）
        docxName = fileName.substring(0, fileName.lastIndexOf("."));
    }

    /*
     * 选择文件保存路径
     */
    private static void showFileSaveDialog(Component parent, JTextArea msgTextArea) {
        // 创建一个默认的文件选取器
        JFileChooser fileChooser = new JFileChooser();

        // 设置打开文件选择框后默认输入的文件名
        fileChooser.setSelectedFile(new File(docxName + ".docx"));

        // 打开文件选择框（线程将被阻塞, 直到选择框被关闭）
        int result = fileChooser.showSaveDialog(parent);

        if (result == JFileChooser.APPROVE_OPTION) {
            FileOutputStream fileOutputStream = null;
            try {
                // 如果点击了"保存", 则获取选择的保存路径
                File file = fileChooser.getSelectedFile();

                fileOutputStream = new FileOutputStream(file);
                fileOutputStream.write(byteArrayOutputStream.toByteArray());

                msgTextArea.append("保存到文件成功: " + file.getAbsolutePath() + "\n\n");
                status = false;
                byteArrayOutputStream = null;
            } catch (Exception e) {
                msgTextArea.append("出现错误...重新保存一下试试" + "\n\n");
            } finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * Pdf转Word输出为ByteArrayOutputStream
     *
     * @param pdfFile pdf文件
     */
    public static ByteArrayOutputStream PdfToByteArrayOutputStream(FileInputStream pdfFile) {
        //加载PDF
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromStream(pdfFile);
        //获取页数
        int count = pdf.getPages().getCount();
        ByteArrayOutputStream[] byteArrayOutputStreams = pdf.saveToStream(0, count - 1, FileFormat.DOCX);
        if (byteArrayOutputStreams.length > 0) {
            return byteArrayOutputStreams[0];
        }
        return new ByteArrayOutputStream();
    }
    /**
     * 将 Exception 转化为 String
     */
    public static String getExceptionToString(Throwable e) {
        if (e == null){
            return "";
        }
        StringWriter stringWriter = new StringWriter();
        e.printStackTrace(new PrintWriter(stringWriter));
        return stringWriter.toString();
    }

}
